﻿using Customer.Domain;
using Customer.Domain.Dto;
using Customer.Infrstructre.ClientManager;
using Customer.Infrstructre.SalesManager;
using Customer.Read.API.Applcation.Command.ProcurementCommand;
using Customer.Read.API.Applcation.Command.SalesRefundCommand;
using MediatR;
using Newtonsoft.Json;
using static WMSpublic.ParseAPI;
using WMSpublic;
using Customer.Infrstructre.ProcurementManager;
using System.Xml.Linq;

namespace Customer.Read.API.Applcation.CommandHandlers.SalesRefundCommandHandler
{
    public class SalesRefundShowCommandHandlers : IRequestHandler<SalesRefundShowCommand, Page<SalesRefundDto>>
    {
        //销售
        ISalesRepository SRepository;

        //销售产品关联表 
        ISellProductRepository SeRepository;

        //客户
        IClientRepository CRepository;

        //退货表
        IRefundRepository RRepository;
        public SalesRefundShowCommandHandlers(ISalesRepository SRepository, IClientRepository CRepository, IRefundRepository RRepository, ISellProductRepository SeRepository)
        {
            this.SRepository = SRepository;
            this.CRepository = CRepository;
            this.RRepository = RRepository;
            this.SeRepository = SeRepository;
        }

        public async Task<Page<SalesRefundDto>> Handle(SalesRefundShowCommand request, CancellationToken cancellationToken)
        {
            List<Products> product = await GetProductsList(1, 100);
            
            var list = from a in await RRepository.GetAllAsync()
                       join b in product on a.ProductsId equals b.ProductsID
                       join c in await SRepository.GetAllAsync() on a.SalesId equals c.SalesId
                       join e in await SeRepository.GetAllAsync() on c.SalesCode equals e.SalesCode
                       join d in await CRepository.GetAllAsync() on c.ClientCode equals d.ClientCode
                       where a.IsDel== false
                       select new SalesRefundDto()
                       {
                           RefundId=a.RefundId,
                           RefundCode=a.RefundCode,
                           ProductsCode=b.ProductsCode,
                           Specs=b.Specs,
                           StorageUnits=b.StorageUnits,
                           Price=b.Price,
                           RefundNum=a.RefundNum,
                           SalesCode=c.SalesCode,
                           ClientName=d.ClientName,
                           ProductsName=b.ProductsName,
                           ClientCode=d.ClientCode,
                           AddTime = a.AddTime,
                           IsRefund=a.IsRefund,
                           SalesPhone=c.SalesPhone,
                           Sremark=c.Sremark,
                           SalesName=c.SalesName,
                           MakePerson=c.MakePerson,
                           SalesTime=c.SalesTime,
                           SellProductNum=e.SellProductNum,
                           DocumentType=c.DocumentType,
                           SalesState=c.SalesState,
                           batch=a.batch
                       };
            if (!string.IsNullOrEmpty(request.RefundCode))
            {
                list = list.Where(c => c.RefundCode.Contains(request.RefundCode));
            }
            if (!string.IsNullOrEmpty(request.SalesCode))
            {
                list = list.Where(c => c.SalesCode.Contains(request.SalesCode));
            }
            if (!string.IsNullOrEmpty(request.ProductsName))
            {
                list=list.Where(c=>c.ProductsName.Contains(request.ProductsName));
            }
            if (!string.IsNullOrEmpty(request.ProductsCode))
            {
                list = list.Where(c => c.ProductsCode.Contains(request.ProductsCode));
            }
            if (request.IsRefund != null)
            {
                list = list.Where(c => c.IsRefund == request.IsRefund);
            }
            if (!string.IsNullOrEmpty(request.ClientName))
            {
                list = list.Where(c => c.ClientName.Contains(request.ClientName));
            }
            if (!string.IsNullOrEmpty(request.ClientCode))
            {
                list = list.Where(c => c.ClientCode.Contains(request.ClientCode));
            }
            if (request.StartDate != null)
            {
                list = list.Where(c => c.AddTime >= request.StartDate);
            }
            if (request.EndDate != null)
            {
                list = list.Where(c => c.AddTime <= request.EndDate);
            }
          

            Page<SalesRefundDto> page = new Page<SalesRefundDto>();
            page.lcount = list.Count();
            page.pcount = (int)Math.Ceiling(page.lcount * 1.0 / request.psize);
            page.list = list.OrderByDescending(x => x.RefundId).Skip((request.pindex - 1) * request.psize).Take(request.psize).ToList();
            return page;
        }

        /// <summary>
        /// 产品
        /// </summary>
        /// <returns></returns>
        public async Task<dynamic> GetProductsList(int pindex, int psize)
        {
            string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyNiIsInNpZCI6IjE4NTk4MDM1MDY2MzA4NTY3MDQiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL2dyb3Vwc2lkIjoiMiIsImp0aSI6IjQzMzA2NmRmLWYyNjAtNDI2Ny1iYWY5LWJkMzgxZGVhZGMwYiIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiLku5jmtJvlmIkiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy91cmkiOiIiLCJpc3MiOiJSZW5hb2JvMjAwNCIsImF1ZCI6IldlaWZ1d3UyMjAzQSJ9.JtV8g_mbUcJgyPC793AMsvjLkmkeuiRR9BAH6rQp8aU";
            HttpClientWrapper cilent = new HttpClientWrapper(token);

            string chanpin = "http://116.205.121.197:8000/cpd/api/ProductRead/GetAllProductInfo?pageindex=" + pindex + "&pagesize=" + psize;

            string postReponse = await cilent.GetAsync(chanpin);
            var json = JsonConvert.DeserializeObject<ApiResultList<Products>>(postReponse);
            return json.data.list;
        }


        //产品
        public class Products
        {
            /// <summary>
            /// 产品id
            /// </summary>
            public int ProductsID { get; set; }
            /// <summary>
            /// 产品编号
            /// </summary>
            public string? ProductsCode { get; set; }
            /// <summary>
            /// 产品名称
            /// </summary>
            public string? ProductsName { get; set; }
            /// <summary>
            /// 厂商编码
            /// </summary>
            public string? VendorsCode { get; set; }
            /// <summary>
            /// 内部编码
            /// </summary>
            public string? InteriorCode { get; set; }
            /// <summary>
            /// 规格
            /// </summary>
            public string? Specs { get; set; }
            /// <summary>
            /// 产品类别
            /// </summary>
            public int? ProductTypeID { get; set; }
            /// <summary>
            /// 存储单位
            /// </summary>
            public string? StorageUnits { get; set; }
            /// <summary>
            /// 预警（上）
            /// </summary>
            public int? Upperlimit { get; set; }
            /// <summary>
            /// 预警（下）
            /// </summary>
            public int? Lowerlimit { get; set; }
            /// <summary>
            /// 包装类型
            /// </summary>
            public int? WrapType { get; set; }
            /// <summary>
            /// 价格
            /// </summary>
            public decimal? Price { get; set; }
            /// <summary>
            /// 重量
            /// </summary>
            public decimal? Weight { get; set; }
            /// <summary>
            /// 默认仓库
            /// </summary>
            public int? WarehouseId { get; set; }
            /// <summary>
            /// 库位
            /// </summary>
            public int? StorehouseId { get; set; }
            /// <summary>
            /// 默认供应商
            /// </summary>
            public int? VendorId { get; set; }
            /// <summary>
            /// 默认客户
            /// </summary>
            public int? ClientId { get; set; }
            /// <summary>
            /// 描述
            /// </summary>
            public string? Describe { get; set; }
            /// <summary>
            /// 产品数量
            /// </summary>
            public int? ProcurementNum { get; set; }
            /// <summary>
            /// 公司id
            /// </summary>
            public string? Office_Id { get; set; }

            /// <summary>
            /// 用户id
            /// </summary>
            public int? User_Id { get; set; }
        }


    }
}
